#pragma once
#include "db.hpp"
#include<string>
#include<queue>
#include<mutex>
#include<atomic>    //原子数据头文件
#include<thread>
#include<functional>
#include<memory>
#include<condition_variable>
#include<iostream>
using namespace std;
// 单例模式
class Connectionpool
{

public:
    //获取单例
    static Connectionpool* getConnectionpool();
    void produceConnectionTask();
    void scannerConnectionTask();

    //获取连接
    //返回一个智能指针，用户使用完，智能指针就失效
    shared_ptr<Mysql> getmysql();
private:
    //单例模式的构造函数私有化
    bool loadconfigfile(); //加载配置时间
    Connectionpool();
    //成员变量
    string _ip; //登录IP
    unsigned int _port; //端口3036
    string _username;   //mysql登录用户名
    string _password;   //mysql登录用户密码
    string _dbname; //数据库名
    int _initSize;  //初始化连接数
    int _maxSize;   //最大连接数
    int _maxldleTime;    //最大空闲时间
    int _connectionTimeout; //连接超时时间

    queue<Mysql*>  _queue;  //队列
    mutex _queuemutex;  //队列锁
    atomic_int _connnectCnt; //维护连接的数量，atomic_int表示这个数据是int类型的原子数据
    condition_variable _cv;//设置条件变量
};